package com.mrogrape.gui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;

import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 * 此类用于创建一个填充了指定颜色的色块儿图标。
 * 
 * @author  liangquan
 * @version 1.0.1
 */
public class ColoredPiece implements Icon {

	/**
	 * 创建一个矩形的Icon。
	 * 
	 * @param color  填充使用的颜色。
	 * @param width  Icon的宽度。
	 * @param height Icon的高度。
	 * @return 创建的Icon。
	 */
	public static Icon createRect(Color color,int width,int height){
		return ColoredPiece.createColoredPiece(color,width,height,ColoredPiece.STYLE_RECT);
	}

	/**
	 * 创建一个带3D立体显示效果的矩形的Icon。
	 * 
	 * @param color  填充使用的颜色。
	 * @param width  Icon的宽度。
	 * @param height Icon的高度。
	 * @return 创建的Icon。
	 */
	public static Icon create3DRect(Color color,int width,int height){
		return ColoredPiece.createColoredPiece(color,width,height,ColoredPiece.STYLE_RECT_3D);
	}

	/**
	 * 创建一个椭圆形的的Icon。
	 * 
	 * @param color  填充使用的颜色。
	 * @param width  Icon的宽度。
	 * @param height Icon的高度。
	 * @return 创建的Icon。
	 */
	public static Icon createOval(Color color,int width,int height){
		return ColoredPiece.createColoredPiece(color,width,height,ColoredPiece.STYLE_OVAL);
	}

	private static Icon createColoredPiece(Color color,int width,int height,int style){
		return new ColoredPiece(color,width,height,style);
	}

	private static final int STYLE_RECT = 1;
	private static final int STYLE_RECT_3D = 2;
	private static final int STYLE_OVAL = 10;

	/**
	 * 使用私有构造函数以阻止外部的实例化。
	 * 
	 * @param color  填充的颜色。
	 * @param width  Icon的宽度。
	 * @param height Icon的高度。
	 * @param style  使用的样式。
	 */
	private ColoredPiece(Color color,int width,int height,int style) {
		this.color = color;
		this.width = width;
		this.height = height;
		this.style = style;
	}

	@Override
	public void paintIcon(Component c, Graphics g, int x, int y) {
		Color oldColor = g.getColor();
		g.setColor(this.color);
		switch(this.style){
			case STYLE_RECT:
				g.fillRect(x,y,this.getIconWidth(), this.getIconHeight());
				break;
			case STYLE_RECT_3D:
				g.fill3DRect(x,y,this.getIconWidth(), this.getIconHeight(), true);
				break;
			case STYLE_OVAL:
				g.fillOval(x,y,this.getIconWidth(), this.getIconHeight());
				break;
			default:
				g.fillRect(x,y,this.getIconWidth(), this.getIconHeight());
		}

		g.setColor(oldColor);
	}

	public int getIconWidth() { 
		return this.width; 
	}

	public int getIconHeight() { 
		return this.height; 
	}

	private int width;
	private int height;
	private int style;
	private Color color;

	public static void main(String args[]){
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.add(new JLabel(ColoredPiece.createOval(Color.RED, 16, 16)));
		f.setVisible(true);
	}
}